5. Frekvencijska analiza i sektorski dijagrami¶
U ovoj lekciji ćeš naučiti:
- kako da izvršiš frekvencijsku analizu niza podataka (što je jedno komplikovano ime za jednu veoma jednostavnu i korisnu stvar); i
- kako da prikažeš zastupljenost nekih veličina na sektorskom dijagramu.
5.1. Frekvencijska analiza niza podataka¶
Frekvencijska analiza niza podataka se svodi na to da se prebroje podaci u nizu i da se na osnovu tako dobijenih frekvencija podataka pokuša doći do nekog zaključka (reč frekvencija znači "učestalost"). Na primer, u jednom razredu ima 30 učenika i njihove ocene iz informatike su date u sledećem nizu:
oceneInf = [3, 4, 5, 4, 5, 3, 4, 5, 2, 4, 5, 4, 5, 4, 2, 3, 1, 4, 5, 4, 3, 2, 3, 4, 5, 4, 5, 5, 4, 3]
Frekvencijska analiza ovog niza se svodi na to da se utvrdi koliko ima petica, četvorki, trojki, dvojki i jedinica u tom razredu. Umesto da to uradimo ručno (recimo, da napravimo tabelicu pa da "lupamo recke"), pustićemo Pajton da to uradi za nas. Pajton ima ugrađenu funkciju count
koja može da prebroji koliko puta se u nekoj listi javlja neki element:
ocena5 = oceneInf.count(5)
ocena4 = oceneInf.count(4)
ocena3 = oceneInf.count(3)
ocena2 = oceneInf.count(2)
ocena1 = oceneInf.count(1)
print("Ocene u razredu su raspodeljene kako sledi:")
print("Ocenu 5 ima", ocena5, "ucenika")
print("Ocenu 4 ima", ocena4, "ucenika")
print("Ocenu 3 ima", ocena3, "ucenika")
print("Ocenu 2 ima", ocena2, "ucenika")
print("Ocenu 1 ima", ocena1, "ucenika")
Za svaku ocenu smo odredili koliko se puta pojavila u listi i dobili smo podatke u apsolutnim iznosima.
Ako želimo da odredimo relativne odnose brojeva ocena, dobijene brojeve ćemo iskazati u procentima:
ukupno = len(oceneInf)
procenat5 = 100.0 * ocena5 / ukupno
procenat4 = 100.0 * ocena4 / ukupno
procenat3 = 100.0 * ocena3 / ukupno
procenat2 = 100.0 * ocena2 / ukupno
procenat1 = 100.0 * ocena1 / ukupno
print("Ocene u razredu su raspodeljene kako sledi:")
print("Ocenu 5 ima ", round(procenat5, 2), "% ucenika", sep="")
print("Ocenu 4 ima ", round(procenat4, 2), "% ucenika", sep="")
print("Ocenu 3 ima ", round(procenat3, 2), "% ucenika", sep="")
print("Ocenu 2 ima ", round(procenat2, 2), "% ucenika", sep="")
print("Ocenu 1 ima ", round(procenat1, 2), "% ucenika", sep="")
Dakle, frekvencijska analiza nam daje vrednosti u konkretnom iznosu (recimo, u razredu ima 9 petica, 11 četvorki i tako dalje). Ako ove podatke predstavimo procentima dobijamo podatke koji nam govore o zastupljenosti ocena u relativnim odnosima.
Tako, u ovom razredu ima 30% petica (9 / 30 = 30%), 36,67% četvorki (11 / 30 = 36,67%), 20% trojki (6 / 30 = 20%), 10% dvojki (3 / 30 = 10%) i 3,33% jedinica (1 / 30 = 3,33%).
5.2. Sektorski dijagrami¶
U situacijama kada se prikazuje koliko procenata koje komponente učestvuje u sastavu neke celine pogodno je podatke prikazati sektorskim dijagramom koji predstavlja krug isečen na isečke poput pice. Krug tada predstavlja celinu (100%), dok isečci predstavljaju komponente koje učestvuju u celini iskazane u procentima.
Na primer, ocene iz informatike su u jednom razredu sa 30 učenika raspodeljene ovako:
Ocena | Zastupljenost ocene |
---|---|
5 | 9 |
4 | 11 |
3 | 6 |
2 | 3 |
1 | 1 |
Podatke iz ove tabele ćemo ilustrovati sektorskim dijagramom. Prvo ćemo uvesti biblioteku:
import matplotlib.pyplot as plt
Onda ćemo podatke zapisati pomoću dva niza ovako:
frekvencije = [9, 11, 6, 3, 1]
ocene = ["5", "4", "3", "2", "1"]
I sada možemo da pređemo na predstavljanje podataka dijagramom. Funkcija koja podatke predstavlja sektorskim dijagramom se zove pie
zato što se u američkom slengu sektorski dijagrami zovu pie charts = "tortasti dijagrami". Prvi argument predstavlja niz vrednosti, dok se drugim zadaju oznake (engl. label = oznaka:):
plt.figure(figsize=(6,6))
plt.pie(frekvencije, labels=ocene)
plt.title("Ocene iz informatike")
plt.show()
plt.close()
Ako želimo da naglasimo broj petica u razredu možemo odgovarajući sektor da "izmaknemo" malo iz središta. To se postiže argumentom explode
funkcije pie
koji za svaki podatak u nizu kaže koliko treba da ga izmaknemo iz središta (0 = ne treba izmestiti sektor iz središta dijagrama; što je veći broj, to je i izmeštanje veće).
frekvencije = [9, 11, 6, 3, 1]
ocene = ["5", "4", "3", "2", "1"]
izmestanje = [0.1, 0, 0, 0, 0]
plt.figure(figsize=(6,6))
plt.pie(frekvencije, labels=ocene, explode=izmestanje)
plt.title("Ocene iz informatike")
plt.show()
plt.close()
Kao drugi primer posmatrajmo strukturu naše atmosfere. Naša atmosfera je smeša raznih gasova, a suv vazduh ima sledeći sastav:
Gas | Zastupljenost (%) |
---|---|
Azot | 78,08 |
Kiseonik | 20,94 |
Argon | 0,93 |
Ugljen dioksid | 0,05 |
Važno je napomenuti da ovo nije tačan sastav naše atmosfere: u njoj ima i drugih gasova, ali u tragovima (kako to hemičari vole da kažu) pa oni nisu prikazani u tabeli.
Strukturu atmosfere ćemo predstaviti sektorskim dijagramom ovako:
procenti = [78.08, 20.94, 0.93, 0.05]
oznake = ["Azot", "Kiseonik", "Argon", "Ugljen dioksid"]
plt.figure(figsize=(7,7))
plt.pie(procenti, labels=oznake)
plt.title("Sastav naše atmosfere")
plt.show()
plt.close()
Opet nailazimo na problem: oznake za poslednja dva podatka su se preklopile jer se radi o veoma uskom sektorima. Da bismo rešili problem možemo još više da povećamo dijagram, a možemo probati i da poslednja dva "mala" sektora "izmaknemo" iz središta, ovako:
procenti = [78.08, 20.94, 0.93, 0.05]
oznake = ["Azot", "Kiseonik", "Argon", "Ugljen dioksid"]
izmestanje = [0, 0, 0.75, 0.75]
plt.figure(figsize=(7,7))
plt.pie(procenti, labels=oznake, explode=izmestanje)
plt.title("Sastav naše atmosfere")
plt.show()
plt.close()
5.3. Zadaci¶
Zadatke reši u Džupajteru.
Zadatak 1. Broj stanovnika naše planete po kontinentima se procenjuje ovako:
Kontinent | Broj stanovnika |
---|---|
Azija | 4.584.807.072 |
Afrika | 1.320.038.716 |
Evropa | 743.102.600 |
Južna Amerika | 658.305.557 |
Severna Amerika | 366.496.802 |
Okeanija | 41.826.176 |
Izraziti broj stanovnika po kontinentima u procentima i ilustrovati podatke sektorskim dijagramom
Zadatak 2. Početkom ovog veka na tržištu optičkih medija tiho se vodio rat formata. Sa širenjem novih formata video zapisa (HD format pre svega) pojavila se potreba za optičkim medijumima većeg kapaciteta, jer na jedan klasičan DVD može da se smesti samo oko 4,5GB podataka, što nije dovoljno za jedan film u HD formatu. U finalnu bitku su ušla dva formata: Blu-ray Disc (kraće BR) i HD-DVD. Oko dve godine (skoro cela 2006. i cela 2007. godina) ova dva formata su bila približno izjednačena u tome koliki udeo tržišta obuhvataju. Onda se početkom 2008. desilo nešto neočekivano: u roku od nedelju dana se situacija drastično promenila. U tabeli ispod je pokazano učešće ova dva formata na svetskom tržištu na dan 5.1.2008. i 12.1.2008:
Datum | Blu-ray Disc | HD-DVD |
---|---|---|
5.1.2008. | 51,17% | 48,83% |
12.1.2008. | 92,53% | 7,47% |
Tako je za samo sedam dana Blu-ray format pobedio i danas je to dominantan format za skladištenje velike količine informacija na optičkim medijumima.
(a) Napravi dva nezavisna sektorska dijagrama: jedan koji pokazuje odnos ova dva formata na tržištu na dan 5.1.2008, i drugi koji pokazuje odnos ova dva formata na tržištu na dan 12.1.2008.
(b*) Probaj da nađeš na Internetu šta se to desilo između 5.1.2008. i 12.1.2008. (Ima veze sa kompanijom Sony, koja je podržavala Blu-ray format, i jednim njenim proizvodom.)
Zadatak 3. Savršena limunada se pravi ovako: jednu šolju šećera razmutiti u jednoj šolji tople vode dok se šećer potpuno ne rastopi. Sipati u to jednu šolju soka od limuna i dodati još tri šolje hladne vode. Izračunati u procentima količinu vode, šećera i soka od limuna u savršenoj limunadi i prikazati te podatke sektorskim dijagramom, ali tako da podatak koji predstavlja količinu šećera bude izdvojen.
Zadatak 4. Izabel je, gledajući kako pada kiša u Makondu, odlučila da cele jedne godine vodi meteorološki dnevnik. Kadgod bi kiša pala u ponedeljak u dnevnik bi upisala 1; ako bi kiša pala u utorak u dnevnik bi upisala 2; za sredu bi upisala 3 i tako redom do nedelje (za kišovite nedelje u dnevnik bi upisivala 7). Tako je dobila sledeći niz brojeva:
IzabelinDnevnik = [1,2,4,7,2,4,7,6,7,5,6,7,3,5,7,1,3,6,2,3,4,2,3,1,4,7,7,
6,5,6,4,5,6,2,3,4,5,1,3,4,2,5,7,2,3,5,3,5,7,6,7,2,3,7,
1,2,3,4,5,6,7,2,7,3,4,1,5,6,1,2,4,5,6,7,1,3,4,1,2,3,4,
2,5,7,6,4,5,6,1,3,7,5,7,1,2,3,7,7,3,4,7,1,2,4,7,4,7,2,
3,4,4,6,8,1,7,7,7,3,4,5,6,7,1,2,4,7,1,2,3,1,7,2,7]
(a) Koliko kišnih dana je Izabel upisala u svoj dnevnik?
(b) Iskaži broj kišnih dana u procentima, ako znaš da ta godina nije bila prestupna.
(v) Utvrdi koliko je Izabel registrovala kišnih ponedeljaka, utoraka, sreda, četvrtaka, petaka i subota u toj godini.
(g) Iskaži u procentima broj kišnih ponedeljaka u odnosu na broj svih ponedeljaka u toj godini, kojih je bilo 53.
(d) Utvrdi najkišniji dan u nedelji u Izabelinom dnevniku i prikaži podatke dobijene pod (v) sektorskim dijagramom. Izdvoj u dijagramu najkišniji dan.
Zadatak 5. U ćeliji ispod nalazi se prvih nekoliko decimala broja $\pi$:
pi_decimale="141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039666557309254711055785376346682065310989652691862056476931"
(a) Utvrdi koliko decimala broja $\pi$ je navedeno u stringu. (Funkcija len
ti može koristiti.)
(b) Napravi frekvencijsku analizu ovog stringa tako što ćeš utvrditi koliko u njemu ima nula, jedinica, dvojki, ...., devetki. (Funkcija count
se može primeniti i na stringove; recimo
pi_decimale.count("0")
će utvrditi broj nula. Obrati pažnju na to da je nula pod navodnicima, jer se radi sa stringovima!)
(v) Predstavi broj nula, jedinica, dvojki, ..., devetki koje si dobio pod (b) u procentima.
(g) Prikaži dobijene podatke sektorskim dijagramom.